''' 
数据连接方式 pymysql+DBUtils
缺点:sql需要在代码中拼接
目前弃用
'''

import pymysql
from DBUtils.PooledDB import PooledDB
from app.Vendor.utilClass import singleton
from app.Vendor.GetConfig import config

@singleton
class MysqlHelper():
    def __init__(self):
        self.POOL = PooledDB(
                        creator=pymysql,  # 使用链接数据库的模块
                        maxconnections=10,  # 连接池允许的最大连接数，0和None表示不限制连接数
                        mincached=2,  # 初始化时，链接池中至少创建的空闲的链接，0表示不创建
                        maxcached=5,  # 链接池中最多闲置的链接，0和None不限制
                        maxshared=3,   #这个参数没多大用，  最大可以被大家共享的链接
                        # 链接池中最多共享的链接数量，0和None表示全部共享。PS: 无用，因为pymysql和MySQLdb等模块的 threadsafety都为1，所有值无论设置为多少，_maxcached永远为0，所以永远是所有链接都共享。
                        blocking=True,  # 连接池中如果没有可用连接后，是否阻塞等待。True，等待；False，不等待然后报错
                        maxusage=None,  # 一个链接最多被重复使用的次数，None表示无限制
                        setsession=[],  # 开始会话前执行的命令列表。如：["set datestyle to ...", "set time zone ..."]
                        ping=0,
                        # ping MySQL服务端，检查是否服务可用。# 如：0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always
                        host=config.mysql_host,
                        port=int(config.mysql_port),
                        user=config.mysql_user,
                        password=config.mysql_password,
                        database=config.mysql_database,
                        charset=config.mysql_charset
                    )

    def insert_one(self, insert_sql,record):
        conn = self.POOL.connection()
        cur = conn.cursor()
        try:
            cur.execute(insert_sql,record)
            conn.commit()
        except Exception as e:
            conn.rollback()

    #批量插入sql  1000条插入一次
    def batch_insert(self,insertSql,records):
        MAX_LEN = 1000
        conn = self.POOL.connection()
        cur = conn.cursor()
        try:
            for i in range(0,len(records),MAX_LEN):
                cur.executemany(insertSql, records[i:i+MAX_LEN])
            conn.commit()
        except Exception as e:
            conn.rollback()

    def delete(self, delete_sql, condition=None):
        conn = self.POOL.connection()
        cur = conn.cursor()
        try:
            cur.execute(delete_sql, condition)
            conn.commit()
        except Exception as e:
            conn.rollback()

    def update_one(self,update_sql,record):
        conn = self.POOL.connection()
        cur = conn.cursor()
        try:
            cur.execute(update_sql,record)
            conn.commit()
        except Exception as e:
            conn.rollback()

    def select_list(self, select_sql,condition=None):
        conn = self.POOL.connection()
        cur = conn.cursor()
        try:
            cur.execute(select_sql,condition)
            results = cur.fetchall()
            return results
        except Exception as e:
            conn.rollback()

if __name__ == '__main__':
    mysqldb = MysqlHelper()
    insertSql = 'INSERT INTO record(respone_type, create_time) VALUES(%s,  now()) '
    mysqldb.insert_one(insertSql,("123",))